/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.upc.wib.service.impl;

import edu.upc.wib.dao.impl.TorneoDaoImpl;
import edu.upc.wib.entity.Contendor;
import edu.upc.wib.entity.Torneo;
import edu.upc.wib.service.TorneoService;
import edu.upc.wib.utilitarios.TorneoException;
import java.util.Date;
import java.util.List;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 *
 * @author jlcr
 */
@Service
public class TorneoServiceImpl implements TorneoService {

    private static Logger log = LoggerFactory.getLogger(TorneoDaoImpl.class);
    @Autowired
    private TorneoDaoImpl torneoDao;

    @Override
    public List<Torneo> obtenerTodos() {
        log.info("Obteniendo Torneos");
        return torneoDao.obtenerTodos();
    }

    @Override
    public List<Contendor> obtenerContendorPorTorneo(Integer idTorneo) {
        log.info("Obteniendo Contendores Por Torneo");
        return torneoDao.obtenerContendorPorTorneo(idTorneo);
    }

    @Override
    public Integer crear(Torneo torneo) throws TorneoException {
        log.info("Actualizando torneo");

        String msgError = "";

        if (!("".equals(torneo.getNombre()) || torneo.getFechaInicio() == null
                || torneo.getFechaFin() == null || torneo.getNumParticipantes() == 0
                || torneo.getNumContendores() == 0 || "".equals(torneo.getEnlace()))) {

            if (torneo.getNumParticipantes() % 2 != 0) {

                if (torneo.getNumContendores() == 4 || torneo.getNumContendores() == 8 || torneo.getNumContendores() == 16 || torneo.getNumContendores() == 32) {

                    Date todayDate = new Date();

                     if (todayDate.before(torneo.getFechaFin())) {

                         if (torneo.getFechaInicio().before(torneo.getFechaFin())) {
                            if (torneoDao.buscarTorneoPorNombreEspefico(torneo.getNombre()) == null) {

                                return torneoDao.crear(torneo);

                            } else {
                                msgError = "El nombre del torneo ya esta registrado.";
                            }
                         } else {
                            msgError = "Fecha de inicio debe ser anterior a fecha de fin.";
                         }

                    } else {
                        msgError = "Fecha de fin debe ser futura.";
                    }

                } else {
                    msgError = "Contendores debe ser potencia de dos.";
                }

            } else {
                msgError = "Participantes debe ser impar.";
            }

        } else {
            msgError = "Existen datos obligatorios en blanco.";
        }

        if (!msgError.isEmpty()) {
            log.error(msgError);
            throw new TorneoException(msgError);
        }

        return null;
    }

    @Override
    public List<Torneo> buscarTorneoPorNombre(String nombreTorneo) {
        log.info("Obteniendo Contendores Por Torneo");
        return torneoDao.buscarTorneoPorNombre(nombreTorneo);
    }

    @Override
    public Torneo buscarTorneoPorNombreEspefico(String nombreTorneo) {
        log.info("Obteniendo el Torneo");
        return torneoDao.buscarTorneoPorNombreEspefico(nombreTorneo);
    }

    @Override
    public String generarCodigoAleatorioEnlace() {
        char[] cs = new char[9];
        int i = 0;
        while (i < 9) {
            Random r = new Random();
            char symbel = (char) (r.nextInt(26) + 'A');
            if ( symbel >= 'A' && symbel <= 'Z') {
                cs[i] = (char) symbel;
                i++;
            }
        }
        return String.copyValueOf(cs);
    }
}
